/*
 * Curve2D.cpp
 *
 *  Created on: 2009/02/15
 *      Author: Yongshik Cho
 */
#include "Curve2D.h"
#include "../Exception.h"


Curve2D::Curve2D()
{
	mIndex = 0;
	mClosed = false;
	mType = _BEZIER;
	mDirection = 1;
}

Curve2D::~Curve2D()
{
	for(vector<BezierNode*>::iterator it=mNodes.begin();it!=mNodes.end();++it)
	{
		BezierNode* node = *it;
		if(node)
			SAFE_DELETE(node);
	}
	mNodes.clear();
}

void Curve2D::addNode(const BezierNode& node)
{
	if(isExists(node))
		return;

	BezierNode* _node = new BezierNode(node);
	if(!_node)
		AltoThrow(Exception::ERR_MEMORY);

	mNodes.push_back(_node);
}

const bool Curve2D::isExists(const BezierNode& node)
{
	for(vector<BezierNode*>::iterator it=mNodes.begin();it!=mNodes.end();++it)
	{
		BezierNode* _node = *it;
		if(_node && *_node == node)
			return true;
	}

	return false;
}

void Curve2D::subNode(const BezierNode& node)
{
	for(vector<BezierNode*>::iterator it=mNodes.begin();it!=mNodes.end();++it)
	{
		BezierNode* _node = *it;
		if(_node && *_node == node)
		{
			SAFE_DELETE(_node);
			mNodes.erase(it);
			return;
		}
	}
}

BezierNode* Curve2D::getNode(const uint32 index)
{
	if(index >= mNodes.size())
		return 0;

	return mNodes[index];
}

void Curve2D::setIndex(const int32 index)
{
	if(index >= (int32)mNodes.size() || index < 0)
		return;

	mIndex = index;
}

BezierNode* Curve2D::getNextNode()
{
	if(mIndex >= (int32)mNodes.size() || mIndex < 0)
		return 0;

	BezierNode* node = mNodes[mIndex];

	mIndex += mDirection;
	if(mIndex >= (int32)mNodes.size())
	{
		if(mClosed)
			mIndex = 0;
	}
	else if(mIndex < 0)
	{
		if(mClosed)
			mIndex = (int32)mNodes.size() - 1;
	}

	return node;
}

void Curve2D::setDirection(const int8 dir)
{
	if(dir >= 0)
		mDirection = 1;
	else
		mDirection = -1;
}
